package reflect_ex_1;

import java.lang.reflect.Method;
import java.util.Scanner;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取一个类对象
//1.类名.class
        //Class cls = String.class;
        //Class cls = int.class;
//注：基本数据类型获取类对象只有上述方式。

//2.Class.forName(String. className)
//基于类的完全限定名(包名.类名)加载一个类
        //Class cls = Class.forName("java.lang.String") ;
        //3.ClassLoader类加载器形式
        /*
        /*
            Method类的实例用于表示某个类上的一个方法
            通过方法对象可以得知该方法的一切信息(访问修饰符，返回值类型，方法名，参数列表等等)
            还可以通过方法对象来调用该方法(反射重点知识)
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名");
        String className = scanner.nextLine();
        Class cls = Class.forName(className);

        //获取类对象表示的类的完全限定名
        /*String name = cls.getName();
        System.out.println(name);*/

        //仅获取类名
        /*name = cls.getSimpleName();
        System.out.println(name);*/

        //Package类的实例用于表示一个包的信息
        Package pack = cls.getPackage();
        //String pname = pack.getName();//获取包名
        String pname = cls.getPackage().getName();
        System.out.println("包名:" + pname);

        /*
            Method类的实例用于表示某个类上的一个方法
            通过方法对象可以得知该方法的一切信息(访问修饰符，返回值类型，方法名，参数列表等等)
            还可以通过方法对象来调用该方法(反射重点知识)
         */
        //Class上的getMethods方法可以获取类对象所表示的类所有公开方法(包含从超类继承的)
        Method[] methods = cls.getMethods();
        for(Method method:methods){
            System.out.println(method.getName());
        }


    }

}
